﻿package cn.flashk.map
{
    import cn.flashk.map.player.*;
    import flash.display.*;
    import flash.events.*;
    import flash.utils.*;

    public class DynamicLayer extends Sprite
    {
        public var isDepthNeedChange:Boolean = true;
        private var self:PlayerSelf;
        private var allObjects:Array;
        private var bgIsInitAndDrag:Boolean = false;

        public function DynamicLayer()
        {
            trace("DynamicLayer");
            self = new PlayerSelf();
            allObjects = new Array();
            this.addChild(self);
            this.addEventListener(Event.ENTER_FRAME, updateDepth);
            MapEngine.getInstance().backgroundLayer.addEventListener("gridAllLoaded", initToBG);
            return;
        }// end function

        public function initObjects(param1:XML) : void
        {
            var _loc_2:ObjectDisplay = null;
            var _loc_5:Number = NaN;
            var _loc_6:Number = NaN;
            var _loc_7:Number = NaN;
            trace("initObjects", param1.object.length());
            var _loc_3:* = new Array();
            bgIsInitAndDrag = false;
            allObjects = new Array();
            var _loc_4:int = 0;
            while (_loc_4 < param1.object.length())
            {
                
                _loc_5 = param1.object[_loc_4].@x;
                _loc_6 = param1.object[_loc_4].@y;
                _loc_7 = Math.sqrt(Math.pow(_loc_5 - MapEngine.getInstance().centerX, 2) + Math.pow(_loc_6 - MapEngine.getInstance().centerY, 2));
                _loc_3.push({data:param1.object[_loc_4], range:_loc_7});
                _loc_4++;
            }
            _loc_3.sortOn("range", Array.NUMERIC);
            _loc_4 = 0;
            while (_loc_4 < _loc_3.length)
            {
                
                _loc_2 = new ObjectDisplay();
                _loc_2.init(_loc_3[_loc_4].data);
                this.addChild(_loc_2);
                allObjects.push(_loc_2);
                _loc_4++;
            }
            return;
        }// end function

        private function updateDepth(event:Event) : void
        {
            var _loc_3:DisplayObject = null;
            if (isDepthNeedChange == false)
            {
                return;
            }
            checkAddRemove();
            var _loc_2:* = new Array();
            var _loc_4:* = this.numChildren;
            var _loc_5:int = 0;
            while (_loc_5 < _loc_4)
            {
                
                _loc_3 = this.getChildAt(_loc_5);
                _loc_2.push({ref:_loc_3, depth:Object(_loc_3).depthY * MapEngine.getInstance().mapWidth + Object(_loc_3).depthX});
                _loc_5++;
            }
            _loc_2.sortOn("depth", Array.NUMERIC);
            var _loc_6:int = 0;
            var _loc_7:* = _loc_2.length;
            _loc_5 = 0;
            while (_loc_5 < _loc_7)
            {
                
                if (this.getChildAt(_loc_5) != _loc_2[_loc_5].ref)
                {
                    this.setChildIndex(_loc_2[_loc_5].ref, _loc_5);
                    _loc_6++;
                }
                _loc_5++;
            }
            return;
        }// end function

        private function checkAddRemove() : void
        {
            var _loc_2:int = 0;
            var _loc_3:int = 0;
            var _loc_7:int = 0;
            var _loc_8:int = 0;
            var _loc_9:int = 0;
            var _loc_10:DisplayObject = null;
            var _loc_11:Array = null;
            var _loc_12:int = 0;
            var _loc_13:Boolean = false;
            if (bgIsInitAndDrag == false)
            {
                return;
            }
            var _loc_1:* = new Array();
            var _loc_4:* = new Array();
            var _loc_5:* = new Array();
            var _loc_6:* = this.numChildren;
            _loc_2 = 0;
            while (_loc_2 < _loc_6)
            {
                
                _loc_10 = this.getChildAt(_loc_2);
                if (_loc_10 is Player)
                {
                    _loc_1.push(_loc_10);
                }
                else
                {
                    _loc_5.push(_loc_10);
                }
                _loc_2++;
            }
            _loc_7 = allObjects.length;
            _loc_8 = _loc_1.length;
            _loc_3 = 0;
            while (_loc_3 < _loc_7)
            {
                
                _loc_2 = 0;
                while (_loc_2 < _loc_8)
                {
                    
                    _loc_11 = _loc_1[_loc_2].getHittestPoints();
                    _loc_9 = _loc_11.length;
                    _loc_12 = 0;
                    while (_loc_12 < _loc_9)
                    {
                        
                        if (_loc_11[_loc_12].x < allObjects[_loc_3].x || _loc_11[_loc_12].x > allObjects[_loc_3].x + allObjects[_loc_3].width || _loc_11[_loc_12].y < allObjects[_loc_3].y || _loc_11[_loc_12].y > allObjects[_loc_3].y + allObjects[_loc_3].height)
                        {
                        }
                        else
                        {
                            _loc_4.push(allObjects[_loc_3]);
                            break;
                        }
                        _loc_12++;
                    }
                    _loc_2++;
                }
                _loc_3++;
            }
            _loc_7 = _loc_5.length;
            _loc_8 = _loc_4.length;
            _loc_2 = 0;
            while (_loc_2 < _loc_7)
            {
                
                _loc_13 = false;
                _loc_3 = 0;
                while (_loc_3 < _loc_8)
                {
                    
                    if (_loc_4[_loc_3] == _loc_5[_loc_2])
                    {
                        _loc_13 = true;
                        break;
                    }
                    _loc_3++;
                }
                if (_loc_13 == false)
                {
                    this.removeChild(_loc_5[_loc_2]);
                }
                _loc_2++;
            }
            _loc_9 = _loc_4.length;
            _loc_2 = 0;
            while (_loc_2 < _loc_9)
            {
                
                if (_loc_4[_loc_2].parent != this)
                {
                    this.addChild(_loc_4[_loc_2]);
                }
                _loc_2++;
            }
            return;
        }// end function

        private function initToBG(event:Event) : void
        {
            setTimeout(initToBGLater, 1000);
            return;
        }// end function

        private function initToBGLater() : void
        {
            bgIsInitAndDrag = true;
            return;
        }// end function

    }
}
